<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算消除行列式</title>
</head>
<body>

</body>
<script>
    //行列 长度定义
    console.time("sort");


    var rowL = 6;
    var colL = 6;
    var shapeArrLength = 3;
    var shapeLength = 4;
    //生成随机行数
    // var numberArr = [0,1,2,3,4,5,6,-1,-1,-1];
    var numberArr = [-1, 1, 2, 3, 4, 5, 6, -1, -1, -1];
    var row = [];
    for (var i = 0; i < rowL; i++) {
        row[i] = [];
        for (var j = 0; j < colL; j++) {
            row[i][j] =
                numberArr[parseInt(Math.random() * 10)];
        }
    }

    console.log("row:");
    for (var i = 0; i < rowL; i++) {

        var content = "";
        for (var j = 0; j < colL; j++) {
            content += row[i][j] + " ";
        }
        console.log(content);
    }

    // delCell(row);
    if (isDeath(row, [[1, 1, 1, -1], [1, 1, 1, -1], [1, 1, 1, -1]])) {
        console.log("能进行下一步");
    } else {
        console.log("不能进行下一步");
    }
    delCell(row);
    console.timeEnd("sort");
    //判断程序是否能进行下一步
    //shapeNumArr 例子[{2,-1,2,1},{2,-1,2,-1},{}]
    function isDeath(row, shapeNumArr) {
        //只有一个格子的数组队
        var oneCellArr = [];
        //两个格子的数组队
        var twoCellArr = [];
        //三个格子的数组队
        var multCellArr = [];


        //遍历每一个号牌
        for (var i = 0; i < shapeArrLength; i++) {
            if (shapeLength.length !== 0) {
                //对每个号码牌的数目相加 每个大于-1的数置为0，如果结果等于-3则为oneArr;如果结果等于-2则为twoArr;如果结果等于-1则为threeArr;
                var sum = 0;
                for (var j = 0; j < shapeLength; j++) {
                    sum += (shapeNumArr[i][j] > -1 ? 0 : -1);
                }
                switch (sum) {
                    case -3:
                        oneCellArr.push(shapeNumArr[i]);
                        break;
                    case -2:
                        twoCellArr.push(shapeNumArr[i]);
                        break;
                    default:
                        multCellArr.push(shapeNumArr[i]);
                        break;
                }

            }
        }

        //遍历有一个格子的数组
        for (var i = 0; i < oneCellArr.length; i++) {
            //如果1个的情况 能不能满足则所有的都不能满足
            return judgeOneCell(row);
        }

        //遍历有两个格子的数组
        for (var i = 0; i < twoCellArr.length; i++) {
            //如果1个的情况 能不能满足则所有的都不能满足
            return judgeTwoCell(row);
        }

        //遍历有多个格子的数组
        for (var i = 0; i < multCellArr.length; i++) {
            if (judgeMultCell(row, multCellArr[i]) === true) {
                return true;
            }

        }


        //判断只有一个格子的情况
        function judgeOneCell(row) {
            for (var i = 0; i < rowL; i++) {
                for (var j = 0; j < colL; j++) {
                    if (row[i][j] === -1) {
                        return true
                    }

                }
            }
            return false;
        }

        return false;

        //判断有两个格子的情况
        function judgeTwoCell(row, shapeNum) {
            //如果格子是横
            if ((shapeNum[0] === -1 && shapeNum[1] === -1) || (shapeNum[2] === -1 && shapeNum[3] === -1)) {
                for (var i = 0; i < rowL; i++) {
                    for (var j = 0; j < colL - 1; j++) {
                        //横向相邻两个为空则返回true
                        if ((row[i][j] === -1) || (row[i][j + 1] === -1)) {
                            return true;
                        }
                    }
                }
            }
            //如果格子是竖
            if ((shapeNum[0] === -1 && shapeNum[2] === -1) || (shapeNum[1] === -1 && shapeNum[3] === -1)) {
                for (var i = 0; i < colL; i++) {
                    for (var j = 0; j < rowL - 1; j++) {
                        //竖向相邻两个为空则返回true
                        if ((row[i][j] === -1) || (row[i][j + 1] === -1)) {
                            return true;
                        }
                    }
                }
            }

            return false;
        }

        //判断有三个格子的情况
        function judgeMultCell(row, shapeNum) {
            //遍历出3个格子能摆放的位置的坐标 并存储
            for (var i = 0; i < rowL - 1; i++) {
                for (var j = 0; j < colL - 1; j++) {
                    var flag = 0;
                    //如果可以摆的棋子位对应棋盘上的位置是空的，则加1
                    if ((shapeNum[0] > -1) && (row[i][j] === -1)) {
                        flag++;
                    }
                    if ((shapeNum[1] > -1) && (row[i][j + 1] === -1)) {
                        flag++;
                    }
                    if ((shapeNum[2] > -1) && (row[i + 1][j] === -1)) {
                        flag++;
                    }
                    if ((shapeNum[3] > -1) && (row[i + 1][j + 1] === -1)) {
                        flag++;
                    }
                    //如果有3个子以上可以放入的棋盘对应位置时则置为空
                    if (flag >= 3) {
                        return true;
                    }

                }
            }

            return false;
        }

    }


    //计算需要删除的行列
    function delCell(row) {
        var col = [];
        //对列进行赋值
        for (var i = 0; i < colL; i++) {
            col[i] = [];
            for (var j = 0; j < rowL; j++) {
                col[i][j] = row[j][i];
            }
        }
        eachRowAndCol(row, col);
        //删除的行数
        var rowDel = [];
        //删除的列数
        var colDel = [];
        //遍历所有的行列 计算结果是否等于10；
        for (var m = 0; m < rowL; m++) {
            var rowSum = 0;
            var colSum = 0;

            for (var n = 0; n < colL; n++) {
                //计算行相加 不为空时
                if (row[m][n] !== -1) {
                    rowSum += row[m][n];
                }
                //计算列相加 不为空时
                if (col[m][n] !== -1) {
                    colSum += col[m][n];
                }
            }
            if (rowSum === 10) {
                console.log("rowSum  " + rowSum);
                rowDel.push(m);
            }
            if (colSum === 10) {
                console.log("colSum  " + colSum);
                colDel.push(m);
            }
        }
        // 用于行列数不相等 计算结果是否等于10；
        // for (var m=0;m<rowL;m++){
        //     var rowSum = 0;
        //     for (var n=0;n<colL;n++){
        //         //计算行相加 不为空时
        //         if (row[m][n] !== -1){
        //             rowSum+=row[m][n];
        //         }
        //
        //     }
        //     if (rowSum ===10){
        //         console.log("rowSum  "+rowSum);
        //         rowDel.push(m);
        //     }
        // }
        // for (var m=0;m<colL;m++){
        //     var colSum = 0;
        //     for (var n=0;n<rowL;n++){
        //         //计算列相加 不为空时
        //         if (col[m][n] !== -1){
        //             colSum+=col[m][n];
        //         }
        //     }
        //     if (colSum ===10){
        //         console.log("colSum  "+colSum);
        //         colDel.push(m);
        //     }
        // }
        var person = {};
        person.firstname = "Bill";
        person.lastname = "Gates";
        person.age = 56;
        person.eyecolor = "blue";


        console.log("删除的行数" + rowDel);
        console.log("删除的列数" + colDel);
        // return [[0,0],[0,2]]
    }


    //遍历行列
    function eachRowAndCol(row, col) {
        console.log("row:");
        for (var i = 0; i < rowL; i++) {

            var content = "";
            for (var j = 0; j < colL; j++) {
                content += row[i][j] + " ";
            }
            console.log(content);
        }
        console.log("col:");
        for (var m = 0; m < colL; m++) {
            var content = "";
            for (var n = 0; n < rowL; n++) {
                content += col[m][n] + " ";
            }
            console.log(content);
        }
    }
</script>
</html>